#include "seqlist.h"

/*******************************************************************************
*函数名：
*函数功能：在堆区创建空表
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
pseqlist creat_seqlist(void)
{
	pseqlist p = NULL;
	p = (pseqlist)malloc(sizeof(seqlist));
	
	if (p == NULL)//如果p为空指针（malloc函数执行出现问题）
	{
		perror("malloc");
		exit(1);
	}
	
	p->last = -1;
	
	return p;
}

#if 0
/*另一种创建空表的方式*/
void init_seqlist(pseqlist* L)
{
	pseqlist p = NULL;
	p = (pseqlist)malloc(sizeof(seqlist));
	
	if (p == NULL)//如果p为空指针（malloc函数执行出现问题）
	{
		perror("malloc");
		exit(1);
	}
	
	p->last = -1;	
	*L = p;
}
#endif

/*******************************************************************************
*函数名：
*函数功能：将数据插入到表的指定位置
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
void insert_data(pseqlist p,int i,STUDENT student)
{
	/*检查插入位置是否合法*/
	if (i < 0 || i > (p->last+1))
	{
		printf("insert position illegal\n");
		return;
	}
		
	/*判断顺序表是否已满*/
	if (isfull_seqlist(p))
	{
		printf("seqlist full\n");
		return;
	}
		
	/*插入数据*/
	int j;
	for(j = p->last; j >= i; j--)
	{
		p->students[j+1] = p->students[j];
	}
	p->students[i] = student;
	p->last++;
}

/*******************************************************************************
*函数名：
*函数功能：将数据按学号顺序插入表
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
void insert(pseqlist p,STUDENT student)
{
	/*判断插入位置*/
	int i;
	for (i = 0; i <= p->last; i++)
		if (student.num < p->students[i].num)	break;
	
	/*插入数据*/
	insert_data(p,i,student);
}

/*******************************************************************************
*函数名：
*函数功能：删除表中指定位置的学生数据
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
void delete_data(pseqlist p,int i)
{
	/*检查删除位置是否合法*/
	if (i < 0 || i > p->last)
	{
		printf("delete position illegal\n");
		return;
	}
		
	/*判断顺序表是否为空*/
	if (isempty_seqlist(p))
	{
		printf("seqlist empty\n");
		return;
	}
		
	/*删除数据*/
	int j;
	for(j = i; j <= (p->last-1); j++)
	{
		p->students[j] = p->students[j+1];
	}
	memset(&p->students[p->last],0,sizeof(STUDENT));
	p->last--;
}

/*******************************************************************************
*函数名：
*函数功能：删除指定学号的学生数据
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
void delete(pseqlist p,int num)
{
	/*判断删除位置*/
	int i;
	for (i = 0; i <= p->last; i++)
		if (num == p->students[i].num)	break;
	
	/*删除数据*/
	delete_data(p,i);
}

/*******************************************************************************
*函数名：
*函数功能：判断表是否已满
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
bool isfull_seqlist(pseqlist p)
{
	if (p->last == size - 1)
		return true;
	else
		return false;
}

/*******************************************************************************
*函数名：
*函数功能：判断表是否为空
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
bool isempty_seqlist(pseqlist p)
{
	if (p->last == -1)
		return true;
	else
		return false;
}

/*******************************************************************************
*函数名：
*函数功能：打印顺序表
*函数参数：
*函数返回值：
*函数说明：
*******************************************************************************/
void print_seqlist(pseqlist p)
{
	int i;
	printf("---------------------------\n");
	for (i = 0; i <= p->last; i++)
		printf("%d\t%s\t%.2f\n", p->students[i].num, p->students[i].name, p->students[i].score);
	printf("---------------------------\n");
}

